home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
docs
/
ippon
/
ver
/
003
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-07-07
|
5KB
|
232 lines
/* 男は一本槍 */
/* main.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/dos.h>
#include <sys/iocs.h>
#include <XSP2lib.H>
#define GLOBAL_DEFINE /* グローバル変数を確保する */
#include "main.h"
#include "player.h"
static int old_crtmod;
#define PCG_MAX 256 /* パターンデータの個数 */
#define FRM_MAX 256 /* フレームデータの個数 */
#define REF_MAX 256 /* リファレンスデータの個数 */
static char pcg_alt[PCG_MAX + 1]; /* PCG配置管理テーブル */
static char pcg_dat[PCG_MAX * 128]; /* PCGデータファイル読み込みバッファ */
static XOBJ_REF_DAT ref_dat[REF_MAX]; /* リファレンスデータ */
static XOBJ_FRM_DAT frm_dat[FRM_MAX]; /* フレームデータ */
static unsigned short pal_dat[16][15]; /* パレットデータ */
void usage (void)
{
printf (
"縦スクロールシューティング・一本槍 IPPON.X ver0.03\n"
" programmed by Mitsuky <FreeSoftware>\n"
"自機が移動できるようにしてみた・player.c を新設した\n"
);
}
/* 終了時に1度だけ呼ばれる・エラーだったら返ってこない */
void Tini (void)
{
int sp;
switch (error_level) {
case ERROR_NON:
xsp_off ();
/* 画面モードを元に戻す */
sp = _iocs_b_super (0);
*(unsigned short *) 0xe8e006 &= 0xfffd; /* HRL ビットを元に戻す */
_iocs_b_super (sp);
_iocs_crtmod (old_crtmod);
_dos_kflushio (0xff); /* キーバッファをクリア */
/* break が無い事に注意 */
case ERROR_FILE:
_iocs_tgusemd (1, 3);
/* break が無い事に注意 */
case ERROR_GUSEMD:
_iocs_tgusemd (0, 3);
/* break が無い事に注意 */
case ERROR_TUSEMD:
/* break が無い事に注意 */
default:
break;
}
if (error_level != ERROR_NON) {
/* エラーが発生した場合 */
puts (error_message);
exit (-1); /* 終了する */
}
}
/* 起動時に1度だけ呼ばれる */
static void Init (void)
{
int sp;
int i, j, r;
static unsigned short crtcdata[9] =
{69, 6, 11 + 8, 59 - 8, 567, 5, 40, 552, 0x0111};
unsigned short *d;
FILE *fp;
error_message = NULL;
/* テキスト画面の使用状況をチェック */
error_level = ERROR_TUSEMD;
if (_iocs_tgusemd (1, -1) == 2) { /* ユーザーが使用中なら */
error_message = "テキスト VRAM が使用中です";
Tini ();
}
_iocs_tgusemd (1, 2);
/* グラフィック画面の使用状況をチェック */
error_level = ERROR_GUSEMD;
i = _iocs_tgusemd (0, -1);
if ((i == 1) || (i == 2)) { /* システムまたはユーザーが使用中なら */
error_message = "グラフィック VRAM が使用中です";
Tini ();
}
_iocs_tgusemd (0, 2);
_iocs_tgusemd (1, 2);
/* 各種ファイル読み込み */
error_level = ERROR_FILE;
/* pcg_dat にパターンデータを読み込む */
fp = fopen ("PLAYER.XSP", "rb");
if (fp == NULL) {
error_message = "PLAYER.XSP が読めません";
Tini ();
}
fread (pcg_dat, sizeof (char), PCG_MAX * 128, fp);
fclose (fp);
/* frm_dat にフレームデータを読み込む */
fp = fopen ("PLAYER.FRM", "rb");
if (fp == NULL) {
error_message = "PLAYER.FRM が読めません";
Tini ();
}
fread (frm_dat, sizeof (XOBJ_FRM_DAT), FRM_MAX, fp);
fclose (fp);
/* ref_dat にリファレンスデータを読み込む */
fp = fopen ("PLAYER.REF", "rb");
if (fp == NULL) {
error_message = "PLAYER.REF が読めません";
Tini ();
}
r = fread (ref_dat, sizeof (XOBJ_REF_DAT), REF_MAX, fp);
fclose (fp);
/* REF_DAT[].ptr 補正 */
for (i = 0; i < r; i++)
(int) ref_dat[i].ptr += (int) frm_dat;
/* pal_dat に一旦パレットデータを読み込む */
fp = fopen ("PLAYER.PAL", "rb");
if (fp == NULL) {
error_message = "PLAYER.PAL が読めません";
Tini ();
}
fread (pal_dat, sizeof (unsigned short), 16 * 15, fp);
fclose (fp);
error_level = ERROR_NON; /* エラーなし */
/* XSP 関連の初期化 */
xsp_on ();
xsp_mode (3);
/* パターンデータを定義 */
xsp_pcgdat_set (pcg_dat, pcg_alt, sizeof (pcg_alt));
xsp_objdat_set (ref_dat);
/* 画面モードの初期化 */
/* 256x256ドット 31kHz 256色モードに */
old_crtmod = _iocs_crtmod (-1); /* 前の CRTMOD を保存 */
_iocs_crtmod (10); /* 256x256dot 31kHz 256色 */
_iocs_g_clr_on (); /* 一応 */
_iocs_sp_init (); /* スプライトの初期化 */
_iocs_sp_on ();
/* 256x256 正方形モードを作る */
sp = _iocs_b_super (0);
*(unsigned short *) 0xe80028 = crtcdata[8];
d = (unsigned short *) 0xe80002;
for (i = 1; i < 8; i++)
*d++ = crtcdata[i];
*(unsigned short *) 0xe80000 = crtcdata[0];
*(unsigned short *) 0xe8e006 |= 0b10; /* HRL ビット */
*(unsigned short *) 0xeb080c = crtcdata[2] + 4;
*(unsigned short *) 0xeb080a = crtcdata[0]; /* スプライト */
*(unsigned short *) 0xeb080e = crtcdata[6];
*(unsigned int *) 0xe80018 = *(unsigned int *) 0xe8001c
= *(unsigned int *) 0xe80020 = *(unsigned int *) 0xe80024
= (0 << 16) + 0; /* グラフィック画面の座標 */
*(unsigned short *) 0xe82500 = 0b01001001001110; /* 優先順位 TX>SP>GR */
_iocs_b_super (sp);
/* パレットデータを定義 */
/* (1パレットブロック=16色) × (15ブロックぶん) 定義する */
{
unsigned short *p = (unsigned short *) pal_dat;
for (i = 1; i < 15; i++)
for (j = 0; j < 16; j++)
_iocs_spalet (0x80000000 | j, i, *p++);
}
}
/* ゲーム本体 */
static void Game (void)
{
printf ("ジョイスティックの [A] ボタンを押すと終了します\n");
PlayerInit ();
PlayerAlloc ();
do {
PlayerMove ();
xsp_out (); /* 表示 */
} while (!game_over);
PlayerFree ();
}
int main (int argc, char *argv[])
{
if (argc != 1) {
usage ();
return (-1);
}
Init ();
Game ();
Tini ();
return (0);
}